package com.ruoyi.web.controller.tool.designpattern.creationalPatterns.factoryMethod;

/**
 * 工厂方法模式
 *
 * @author Hack2003
 * @date 2024/3/21 10:40
 **/
// 抽象产品：饮料接口
interface Drink {
    void make();
}

// 具体产品：可乐类
class Coke implements Drink {
    @Override
    public void make() {
        System.out.println("正在制作一杯可乐...");
    }
}

// 具体产品：雪碧类
class Sprite implements Drink {
    @Override
    public void make() {
        System.out.println("正在制作一杯雪碧...");
    }
}

// 抽象工厂：饮料店接口
interface DrinkShop {
    Drink makeDrink();
}

// 具体工厂：可乐饮料店
class CokeShop implements DrinkShop {
    @Override
    public Drink makeDrink() {
        return new Coke();
    }
}

// 具体工厂：雪碧饮料店
class SpriteShop implements DrinkShop {
    @Override
    public Drink makeDrink() {
        return new Sprite();
    }
}

/**
 * 工厂方法模式的实现例子，我们可以使用一个饮料店的例子来说明。
 * 在这个例子中，饮料店（抽象工厂）可以生产不同类型的饮料（具体产品），
 * 而每种饮料由其对应的饮料工厂（具体工厂）负责生产。
 */
public class Test {
    public static void main(String[] args) {
        // 创建不同的饮料店（具体工厂）
        DrinkShop cokeShop = new CokeShop();
        DrinkShop spriteShop = new SpriteShop();

        // 通过饮料店制作饮料（调用工厂方法）
        Drink coke = cokeShop.makeDrink();
        coke.make();  // 输出: 正在制作一杯可乐...

        Drink sprite = spriteShop.makeDrink();
        sprite.make();  // 输出: 正在制作一杯雪碧...
    }
}
